//#include <iostream>
//#include <algorithm>
//using namespace std;
//
//int dx[] = { 0, 0, 1, -1 };
//int dy[] = { 1, -1, 0, 0 };
//
//const int N = 110;
//int a[N][N] = { 0 };
//int n, m;
//int ret = 0;
//
//int st[N][N] = { 0 };
//
//int dfs(int x, int y)
//{
//	int len = 1;
//	if (st[x][y])
//		return st[x][y];
//
//	for (int k = 0; k < 4; k++)
//	{
//		int i = x + dx[k];
//		int j = y + dy[k];
//
//		if (i >= 1 && i <= n && j >= 1 && j <= m && a[i][j] > a[x][y])
//		{
//			len = max(1 + dfs(i,j), len);
//		}
//	}
//
//	
//
//	return st[x][y] = len;
//}
//
//int main()
//{
//	cin >> n >> m;
//	for (int i = 1; i <= n; i++)
//	{
//		for (int j = 1; j <= m; j++)
//		{
//			cin >> a[i][j];
//		}
//	}
//
//	for (int i = 1; i <= n; i++)
//	{
//		for (int j = 1; j <= m; j++)
//		{
//			dfs(i, j);
//		}
//	}
//
//	for (int i = 1; i <= n; i++)
//	{
//		for (int j = 1; j <= m; j++)
//		{
//			ret = max(ret, st[i][j]);
//		}
//	}
//
//	cout << ret << endl;
//
//	return 0;
//}

//#include <iostream>
//#include <cstring>
//#include <queue>
//using namespace std;
//
//int dx[] = { 1, 1, -1, -1, 2, 2, -2, -2 };
//int dy[] = { 2, -2, 2, -2, 1, -1, 1, -1 };
//
//const int N = 410;
//int a[N][N];
//int n, m;
//int x, y;
//
//void bfs()
//{
//	queue< pair<int, int>> q;
//	a[x][y] = 0;
//	q.push({ x, y });
//	
//	while (q.size())
//	{
//		int i = q.front().first;
//		int j = q.front().second;
//		q.pop();
//		for (int k = 0; k < 8; k++)
//		{
//			int x = i + dx[k];
//			int y = j + dy[k];
//			if (x >= 1 && x <= n && y >= 1 && y <= m && a[x][y] == -1)
//			{
//				a[x][y] = 1 + a[i][j];
//				q.push({ x, y });
//			}
//		}
//	}
//}
//
//int main()
//{
//	cin >> n >> m >> x >> y;
//	memset(a, -1, sizeof(a));
//	bfs();
//	for (int i = 1; i <= n; i++)
//	{
//		for (int j = 1; j <= m; j++)
//		{
//			cout << a[i][j] << " ";
//		}
//		cout << endl;
//	}
//	return 0;
//}

//#include <iostream>
//#include <cstring>
//#include <queue>
//using namespace std;
//
//int n, x, y;
//int st[100010] = { 0 };
//
//void bfs()
//{
//	memset(st, -1, sizeof(st));
//	queue<int> q;
//	q.push(x);
//	st[x] = 0;
//	while (q.size())
//	{
//		int t = q.front();
//		q.pop();
//		
//		for (int i = 1; i <= 3; i++)
//		{
//			int tmp = t;
//			if (i == 1)
//			{
//				tmp += 1;
//			}
//			else if (i == 2)
//			{
//				tmp -= 1;
//			}
//			else
//			{
//				tmp *= 2;
//			}
//
//			if (tmp >= 1 && tmp <= 100000 && st[tmp] == -1)
//			{
//				st[tmp] = st[t] + 1;
//				q.push(tmp);
//				if (tmp == y)
//					return;
//			}
//		}
//
//		
//	}
//}
//
//int main()
//{
//	cin >> n;
//	while (n--)
//	{
//		cin >> x >> y;
//		bfs();
//		cout << st[y] << endl;
//	}
//	
//	return 0;
//}

#include <iostream>
#include <string>
#include <queue>
#include <unordered_map>
using namespace std;

int dx[] = { 0, 0, 1, -1 };
int dy[] = { 1, -1, 0, 0 };

string a;
unordered_map<string, int> mp;

void bfs()
{
	queue<string> q;
	q.push(a);
	mp[a] = 0;

	while (q.size())
	{
		string top = q.front();
		q.pop();

		int pos = 0;
		while (top[pos] != '0')
		{
			pos++;
		}
		int x = pos / 3;
		int y = pos % 3;

		for (int k = 0; k < 4; k++)
		{
			string tmp = top;
			int i = x + dx[k];
			int j = y + dy[k];

			if (i >= 0 && i < 3 && j >= 0 && j < 3)
			{
				int index = i * 3 + j;
				swap(tmp[pos], tmp[index]);

				if (mp.count(tmp))
					continue;

				mp[tmp] = mp[top] + 1;

				if (tmp == "123804765")
				{
					return;
				}
				q.push(tmp);
			}
		}
	}
}

int main()
{
	cin >> a;
	bfs();
	cout << mp["123804765"] << endl;
	return 0;
}